home *** CD-ROM | disk | FTP | other *** search
- function ARC4() {
- this._S = new Array(256);
- this._i = 0;
- this._j = 0;
- }
- ARC4.prototype.setKey = function(key, opt_length) {
- if (!isArray(key)) {
- throw new Error("Key parameter must be a byte array");
- }
- if (!opt_length) {
- opt_length = key.length;
- }
- var S = this._S;
- for (var i = 0; i < 256; ++i) {
- S[i] = i;
- }
- var j = 0;
- for (var i = 0; i < 256; ++i) {
- j = (j + S[i] + key[i % opt_length]) & 255;
- var tmp = S[i];
- S[i] = S[j];
- S[j] = tmp;
- }
- this._i = 0;
- this._j = 0;
- }
- ARC4.prototype.discard = function(n) {
- var devnul = new Array(n);
- this.crypt(devnul);
- }
- ARC4.prototype.crypt = function(data, opt_length) {
- if (!opt_length) {
- opt_length = data.length;
- }
- if (!isArray(data)) {
- throw new Error("Data parameter must be a byte array");
- }
- var i = this._i;
- var j = this._j;
- var S = this._S;
- for (var n = 0; n < opt_length; ++n) {
- i = (i + 1) & 255;
- j = (j + S[i]) & 255;
- var tmp = S[i];
- S[i] = S[j];
- S[j] = tmp;
- data[n] ^= S[(S[i] + S[j]) & 255];
- }
- this._i = i;
- this._j = j;
- }
-